package fr.charlott.business.service.impl;

import java.util.ArrayList;
import java.util.List;

import org.dozer.DozerBeanMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.dto.SaisonDTO;
import fr.charlott.business.service.ProduitService;
import fr.charlott.core.repository.model.Collection;
import fr.charlott.core.repository.model.Produit;
import fr.charlott.core.repository.model.Saison;

@Service("produitService")
public class ProduitServiceImpl implements ProduitService {

	private fr.charlott.core.service.ProduitService produitService;
	
	private DozerBeanMapper dozerMapper;
	
	public ProduitServiceImpl() {
		super();
	}

	@Autowired
	public ProduitServiceImpl(fr.charlott.core.service.ProduitService produitService, DozerBeanMapper dozerMapper) {
		this();
		this.produitService = produitService;
		this.dozerMapper = dozerMapper;
	}

	@Override
	@Transactional
	public void ajouterProduit(ProduitDTO produitDTO) {
		produitService.ajouterProduit(dozerMapper.map(produitDTO, Produit.class));
	}
	
	@Override
	@Transactional
	public void importerProduit(ProduitDTO produitDTO) {
		produitService.ajouterProduit(dozerMapper.map(produitDTO, Produit.class));
	}
	
	@Override
	@Transactional
	public void supprimerProduit(ProduitDTO produitDTO) {
		if (produitService.chercherParId(produitDTO.getId()) != null) {
			produitService.supprimerProduit(dozerMapper.map(produitDTO, Produit.class));
		}
	}
	
	@Override
	@Transactional
	public void supprimerTousLesProduits() {
		produitService.supprimerTousLesProduits();
	}

	@Override
	@Transactional(readOnly = true)
	public ProduitDTO chercherParId(Long id) {
		return dozerMapper.map(produitService.chercherParId(id), ProduitDTO.class);
	}
	
	@Override
	@Transactional(readOnly = true)
	public ProduitDTO chercherParReference(String reference) {
		Produit produit = produitService.chercherParReference(reference);
		if(produit != null){
			return dozerMapper.map(produit, ProduitDTO.class);
		}
		return null;
	}

	@Override
	@Transactional(readOnly = true)
	public List<ProduitDTO> chargerTousLesProduits() {
		List<ProduitDTO> produits = new ArrayList<ProduitDTO>();
		for (Produit produit : produitService.chargerTousLesProduits()) {
			produits.add(dozerMapper.map(produit, ProduitDTO.class));
		}
		return produits;
	}
	
	@Override
	@Transactional(readOnly = true)
	public List<ProduitDTO> chargerTousLesProduitsPourLaSaison(SaisonDTO selectedSaison) {
		List<ProduitDTO> produits = new ArrayList<ProduitDTO>();
		for (Produit produit : produitService.chargerTousLesProduitsPourLaSaison(dozerMapper.map(selectedSaison, Saison.class))) {
			produits.add(dozerMapper.map(produit, ProduitDTO.class));
		}
		return produits;
	}
	
	@Override
	public int getNbProduitVenudusParCollection(Collection collection, SaisonDTO saison){
		//return personneService.getNbSoldedProductsByCollection(collection, dozerMapper.map(saison, Saison.class));
		return 0;
	}
	
	// getters - setters

	/**
	 * @param dozerMapper
	 *            the dozerMapper to set
	 */
	public void setProduitMapper(DozerBeanMapper dozerMapper) {
		this.dozerMapper = dozerMapper;
	}

	/**
	 * @param ProduitService
	 *            the ProduitService to set
	 */
	public void setProduitService(fr.charlott.core.service.ProduitService produitService) {
		this.produitService = produitService;
	}

}
